﻿using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace Serwer
{
    class Klient
    {
        public static List<Klient> listaKlientow = new List<Klient>();

        Socket gniazdko;
        byte[] bufor = new byte[1000];
        Thread watek;
        int id;
        bool czyWyslanoPowiadomienie = false, czyOdpowiedz = true;
        string wiadomosc;

        public bool CzyOdpowiedz
        {
            get { return czyOdpowiedz; }
            set { czyOdpowiedz = value; }
        }

        public bool CzyWyslanoPowiadomienie
        {
            get { return czyWyslanoPowiadomienie; }
            set { czyWyslanoPowiadomienie = value; }
        }

        public Klient(Socket gniazdko)
        {
            Console.WriteLine("Polaczono: " + this.GetHashCode());

            id = this.GetHashCode();
            this.gniazdko = gniazdko;

            watek = new Thread(watekPolaczenia);
            watek.Start();
        }

        public void wyslijPowiadomienie()
        {
            try
            {
                if (czyOdpowiedz)
                {
                    wiadomosc = DateTime.Now.ToShortDateString() + "|" + DateTime.Now.ToLongTimeString();
                    gniazdko.Send(ASCIIEncoding.ASCII.GetBytes("wiadomosc " + wiadomosc + "\r\n"));
                    czyOdpowiedz = false;
                    czyWyslanoPowiadomienie = true;
                }
                else
                {
                    gniazdko.Send(ASCIIEncoding.ASCII.GetBytes("ponowienie " + wiadomosc + "\r\n"));
                    Console.WriteLine(id + ":ponowienie");
                }
            }
            catch (Exception)
            { }
        }

        private void watekPolaczenia()
        {
            for (; ; )
            {
                try
                {
                    int ile = gniazdko.Receive(bufor);
                    if (ile != 0)
                    {
                        string odebrane = ASCIIEncoding.ASCII.GetString(bufor, 0, ile - 2);
                        Console.WriteLine(id + ": " + odebrane);

                        if (odebrane == "odebrano")
                        {
                            gniazdko.Send(ASCIIEncoding.ASCII.GetBytes("ok\r\n"));

                            lock (this)
                            {
                                czyOdpowiedz = true;
                                czyWyslanoPowiadomienie = false;
                            }
                        }
                    }
                    else
                    {
                        watek.Abort();
                    }
                }
                catch (ObjectDisposedException)
                {
                    gniazdko.Close();
                    usunKlienta();
                    watek.Abort();
                }
                catch (SocketException)
                {
                    usunKlienta();
                    watek.Abort();
                }
                catch (Exception)
                {
                    gniazdko.Close();
                    usunKlienta();
                }
            }
        }

        private void usunKlienta()
        {
            lock (listaKlientow)
            {
                listaKlientow.Remove(this);
            }
            Console.WriteLine("Rozlaczono: " + id);
        }
    }
}
